# coding: utf-8

puts '单引号字符串'

# 有且只有\和'需要转义
puts 'it\'s me!'
puts 'C:\\Test.txt'

# 这些情况不会转义，原样输出。
puts 'a\b'
puts 'a\n'
puts 'a\
b'

# 使用续行符
message =
'A'\
'B'\
'C'
puts message

puts "双引号字符串"
puts "支持插接：1 + 2 = #{1 + 2}"

# 如果插接的是全局变量、类成员或实例成员的话，大括号可以省略。
$x, $y = 1, 1
puts "#$x + #$y = #{$x + $y}"

puts "%s + %s = %s" % [$x, $y, $x + $y]

puts "A
B"

puts "A\
B"

puts "\u00D7"
puts "\u{D7}"
puts "\u{D7 D7}"

# 任意单个字符作为界定符
puts %q{C:\Test.txt}
puts %Q{#{100}}
puts %Q-#{100}-
puts %{#{100}}

# HERE文档，任意字符串作为界定符。
puts <<___
你好吗？
___

puts <<-___
你好吗？
___

# 表现的像单引号字符串
puts <<'THIS IS THE END, MY ONLY FRIEND, THE END'
    .
    . lots and lots of text goes here
    . with no escaping at all.
    .
THIS IS THE END, MY ONLY FRIEND, THE END

# 表现的像双引号一样
title = "幸福框架"
body = "每日博客"

puts <<-"# # #"
<html><head><title>#{title}</title></head>
<body>
<h1>#{title}</h1>
#{body}
</body>
</html>
# # #

# 执行命令行
`dir`
%x(dir)
# 也可以这样执行：Kernel.`("dir")

# 字符串是可变的，相同的字符串是不同的实例。
10.times do
	puts "hi".object_id
end

# 字符字面量
puts ?A.class # String
puts ?\t + "t"

# 字符串操作

# + 会返回一个新的字符串，而且只能对两个字符串执行运算。
puts "Hello," + "duan!"
puts 1.to_s + 1.to_s
puts "#{1}#{1}"

# << 将右侧的字符串插入到左侧的字符串后面，会修改左侧的字符串。
puts "Hello," << "duan!"
puts "A" << ?B
puts "AB" << 67

# * 重复在指定的字符串。
puts "A" * 3

# 字符串长度
str = "hi,段光伟!"
puts str.length

# 访问字符串
puts str[0]
puts str[-1]
puts str[0, 2]
puts str[0..1]
puts str["段光伟"]
puts str[/段../]

# 修改字符串
str[str.length] = "你好吗?"
str[str.length, 0] = "我不好！"
str["段光伟"] = "段光宇"
str[/段../] = "段晨旭"
puts str

# 字符串编码
str_utf8 = "hi 段"
puts str_utf8 .encoding # UTF-8
str_utf8.each_byte {|b| print "%02X," % [b]} # 68,69,20,E6,AE,B5,
puts

str_gb2312 = "hi 段".encode("gb2312")
puts str_gb2312 .encoding # GB2312
str_gb2312.each_byte {|b| print "%02X," % [b]} # 68,69,20,B6,CE,
puts

# \u 代表了字符在字符集中的位置（码点），和编码对应的字节没有关系。
str = "\u6BB5"
puts str # 段             
str.each_byte {|b| print "%02X," % [b]} # E6,AE,B5,
puts

puts "\xE6\xAE\xB5" # 段
puts "\u6BB5" # 段

utf8_str = "\xE6\xAE\xB5".encode("utf-8")
puts utf8_str.encoding() # UTF-8
puts utf8_str.size # 1
puts utf8_str.bytesize # 3

ascii_str = "\xE6\xAE\xB5".force_encoding("ascii")
puts ascii_str.encoding() # US-ASCII
puts ascii_str.size # 3
puts ascii_str.bytesize # 3
puts ascii_str.valid_encoding? # false

begin
	puts "段".encode("ascii")
rescue Exception => e
	puts e.class
end

puts "段".encode("gb2312").encode("utf-8")
